/*
 * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
 *
 * This software is open source.
 * See the bottom of this file for the licence.
 */

package com.googlecode.bluetools.dom4j.dom;

import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.UserDataHandler;

import com.googlecode.bluetools.dom4j.Element;
import com.googlecode.bluetools.dom4j.Text;
import com.googlecode.bluetools.dom4j.tree.DefaultText;

/**
 * <p>
 * <code>DOMText</code> implements a Text node which supports the W3C DOM API.
 * </p>
 * 
 * @author <a href="mailto:jstrachan@apache.org">James Strachan </a>
 * @version $Revision: 1.1 $
 */
public class DOMText extends DefaultText implements org.w3c.dom.Text {
	public DOMText(String text) {
		super(text);
	}

	public DOMText(Element parent, String text) {
		super(parent, text);
	}

	// org.w3c.dom.Node interface
	// -------------------------------------------------------------------------
	public boolean supports(String feature, String version) {
		return DOMNodeHelper.supports(this, feature, version);
	}

	public String getNamespaceURI() {
		return DOMNodeHelper.getNamespaceURI(this);
	}

	public String getPrefix() {
		return DOMNodeHelper.getPrefix(this);
	}

	public void setPrefix(String prefix) throws DOMException {
		DOMNodeHelper.setPrefix(this, prefix);
	}

	public String getLocalName() {
		return DOMNodeHelper.getLocalName(this);
	}

	public String getNodeName() {
		return "#text";
	}

	// already part of API
	//
	// public short getNodeType();
	public String getNodeValue() throws DOMException {
		return DOMNodeHelper.getNodeValue(this);
	}

	public void setNodeValue(String nodeValue) throws DOMException {
		DOMNodeHelper.setNodeValue(this, nodeValue);
	}

	public org.w3c.dom.Node getParentNode() {
		return DOMNodeHelper.getParentNode(this);
	}

	public NodeList getChildNodes() {
		return DOMNodeHelper.getChildNodes(this);
	}

	public org.w3c.dom.Node getFirstChild() {
		return DOMNodeHelper.getFirstChild(this);
	}

	public org.w3c.dom.Node getLastChild() {
		return DOMNodeHelper.getLastChild(this);
	}

	public org.w3c.dom.Node getPreviousSibling() {
		return DOMNodeHelper.getPreviousSibling(this);
	}

	public org.w3c.dom.Node getNextSibling() {
		return DOMNodeHelper.getNextSibling(this);
	}

	public NamedNodeMap getAttributes() {
		return null;
	}

	public Document getOwnerDocument() {
		return DOMNodeHelper.getOwnerDocument(this);
	}

	public org.w3c.dom.Node insertBefore(org.w3c.dom.Node newChild, org.w3c.dom.Node refChild) throws DOMException {
		checkNewChildNode(newChild);

		return DOMNodeHelper.insertBefore(this, newChild, refChild);
	}

	public org.w3c.dom.Node replaceChild(org.w3c.dom.Node newChild, org.w3c.dom.Node oldChild) throws DOMException {
		checkNewChildNode(newChild);

		return DOMNodeHelper.replaceChild(this, newChild, oldChild);
	}

	public org.w3c.dom.Node removeChild(org.w3c.dom.Node oldChild) throws DOMException {
		return DOMNodeHelper.removeChild(this, oldChild);
	}

	public org.w3c.dom.Node appendChild(org.w3c.dom.Node newChild) throws DOMException {
		checkNewChildNode(newChild);

		return DOMNodeHelper.appendChild(this, newChild);
	}

	private void checkNewChildNode(org.w3c.dom.Node newChild) throws DOMException {
		throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, "Text nodes cannot have children");
	}

	public boolean hasChildNodes() {
		return DOMNodeHelper.hasChildNodes(this);
	}

	public org.w3c.dom.Node cloneNode(boolean deep) {
		return DOMNodeHelper.cloneNode(this, deep);
	}

	public void normalize() {
		DOMNodeHelper.normalize(this);
	}

	public boolean isSupported(String feature, String version) {
		return DOMNodeHelper.isSupported(this, feature, version);
	}

	public boolean hasAttributes() {
		return DOMNodeHelper.hasAttributes(this);
	}

	// org.w3c.dom.CharacterData interface
	// -------------------------------------------------------------------------
	public String getData() throws DOMException {
		return DOMNodeHelper.getData(this);
	}

	public void setData(String data) throws DOMException {
		DOMNodeHelper.setData(this, data);
	}

	public int getLength() {
		return DOMNodeHelper.getLength(this);
	}

	public String substringData(int offset, int count) throws DOMException {
		return DOMNodeHelper.substringData(this, offset, count);
	}

	public void appendData(String arg) throws DOMException {
		DOMNodeHelper.appendData(this, arg);
	}

	public void insertData(int offset, String arg) throws DOMException {
		DOMNodeHelper.insertData(this, offset, arg);
	}

	public void deleteData(int offset, int count) throws DOMException {
		DOMNodeHelper.deleteData(this, offset, count);
	}

	public void replaceData(int offset, int count, String arg) throws DOMException {
		DOMNodeHelper.replaceData(this, offset, count, arg);
	}

	// org.w3c.dom.Text interface
	// -------------------------------------------------------------------------
	public org.w3c.dom.Text splitText(int offset) throws DOMException {
		if (isReadOnly()) {
			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, "CharacterData node is read only: " + this);
		}
		else {
			String text = getText();
			int length = (text != null) ? text.length() : 0;

			if ((offset < 0) || (offset >= length)) {
				throw new DOMException(DOMException.INDEX_SIZE_ERR, "No text at offset: " + offset);
			}
			else {
				String start = text.substring(0, offset);
				String rest = text.substring(offset);
				setText(start);

				Element parent = getParent();
				Text newText = createText(rest);

				if (parent != null) {
					parent.add(newText);
				}

				return DOMNodeHelper.asDOMText(newText);
			}
		}
	}

	// Implementation methods
	// -------------------------------------------------------------------------
	protected Text createText(String text) {
		return new DOMText(text);
	}

	public String getWholeText() {
		// TODO Auto-generated method stub
		return null;
	}

	public boolean isElementContentWhitespace() {
		// TODO Auto-generated method stub
		return false;
	}

	public org.w3c.dom.Text replaceWholeText(String content) throws DOMException {
		// TODO Auto-generated method stub
		return null;
	}

	public short compareDocumentPosition(Node other) throws DOMException {
		// TODO Auto-generated method stub
		return 0;
	}

	public String getBaseURI() {
		// TODO Auto-generated method stub
		return null;
	}

	public Object getFeature(String feature, String version) {
		// TODO Auto-generated method stub
		return null;
	}

	public String getTextContent() throws DOMException {
		// TODO Auto-generated method stub
		return null;
	}

	public Object getUserData(String key) {
		// TODO Auto-generated method stub
		return null;
	}

	public boolean isDefaultNamespace(String namespaceURI) {
		// TODO Auto-generated method stub
		return false;
	}

	public boolean isEqualNode(Node arg) {
		// TODO Auto-generated method stub
		return false;
	}

	public boolean isSameNode(Node other) {
		// TODO Auto-generated method stub
		return false;
	}

	public String lookupNamespaceURI(String prefix) {
		// TODO Auto-generated method stub
		return null;
	}

	public String lookupPrefix(String namespaceURI) {
		// TODO Auto-generated method stub
		return null;
	}

	public void setTextContent(String textContent) throws DOMException {
		// TODO Auto-generated method stub

	}

	public Object setUserData(String key, Object data, UserDataHandler handler) {
		// TODO Auto-generated method stub
		return null;
	}
}

/*
 * Redistribution and use of this software and associated documentation ("Software"), with or without modification, are
 * permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain copyright statements and notices. Redistributions must also contain a
 * copy of this document.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
 * following disclaimer in the documentation and/or other materials provided with the distribution.
 * 
 * 3. The name "DOM4J" must not be used to endorse or promote products derived from this Software without prior written
 * permission of MetaStuff, Ltd. For written permission, please contact dom4j-info@metastuff.com.
 * 
 * 4. Products derived from this Software may not be called "DOM4J" nor may "DOM4J" appear in their names without prior
 * written permission of MetaStuff, Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
 * 
 * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
 * 
 * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
 */
